package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOContacto;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.TIPO_CONTACTO;
import pe.com.cotelasa.scp.entidad.Contacto;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.Sede;

@Repository("daoContacto")
public class DAOContactoImpl extends DaoImpl<Contacto, Integer> implements IDAOContacto, Serializable {

    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public Contacto obtenerContactoPorNombre(String nombre) throws DAOException {
        Contacto ordenPedidoBuscado = null;
        try {
            ordenPedidoBuscado = (Contacto) sessionFactory.getCurrentSession().createCriteria(Contacto.class)
                    .add(Restrictions.eq("nombre", nombre))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor())).uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return ordenPedidoBuscado;
    }

    @SuppressWarnings("unchecked")
    @Transactional
    public Collection<Contacto> buscarContactosPorSede(Sede sede) throws DAOException {
        List<Contacto> listaContactos = new ArrayList<Contacto>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaContactos = sessionFactory.getCurrentSession().createCriteria(Contacto.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idSede", sede))
                    .list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaContactos;
    }

    @SuppressWarnings("unchecked")
    @Transactional
    public Collection<Contacto> buscarContactosPorSedeYTipo(Contacto contacto) throws DAOException {
        List<Contacto> listaContactos = new ArrayList<Contacto>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaContactos = sessionFactory.getCurrentSession().createCriteria(Contacto.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idTipoContacto", contacto.getIdTipoContacto()))
                    .add(Restrictions.eq("idSede", contacto.getIdSede()))
                    .list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaContactos;
    }

    @SuppressWarnings("unchecked")
    @Override
    public Collection<Contacto> buscarRepresentantePorEmpresa(Empresa empresa)
            throws DAOException {
        List<Contacto> listaContactos = new ArrayList<Contacto>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaContactos = sessionFactory.getCurrentSession().createCriteria(Contacto.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idTipoContacto.id", TIPO_CONTACTO.REPRESENTANTE.getValor()))
                    .add(Restrictions.in("idSede", empresa.getSedeCollection()))
                    .list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaContactos;
    }
}
